import asyncio
import os

import yaml
from pywebio.input import *
from pywebio.output import *

from app.web.views.ViewsUtils import ViewsUtils


class VideoSearchSimple:
    """简化的视频搜索功能类"""
    
    def __init__(self):
        self.search_results = None
        self.current_keyword = ""
    
    def search_interface(self):
        """搜索界面主函数"""
        # 清除之前的内容
        clear()
        
        # 标题
        put_html("<h1>🔍 抖音视频搜索</h1>")
        put_html("<hr>")
        
        # 简化的搜索表单
        data = input_group("搜索视频", [
            input(
                name="keyword",
                label="搜索关键字",
                placeholder="请输入搜索关键字，如：美食、旅游等",
                required=True,
                validate=self.validate_keyword
            ),
            select(
                name="count",
                label="获取数量",
                options=[
                    (3, "3"),
                    (5, "5")
                ],
                value=3
            )
        ])
        
        # 开始搜索
        self.current_keyword = data["keyword"]
        self.start_search(
            keyword=data["keyword"],
            count=data["count"]
        )
    
    def validate_keyword(self, keyword):
        """验证关键字"""
        if not keyword or len(keyword.strip()) == 0:
            return "关键字不能为空"
        
        if len(keyword.strip()) > 50:
            return "关键字太长，请控制在50字符以内"
        
        return None
    
    def start_search(self, keyword: str, count: int):
        """开始搜索"""
        put_html("<hr>")
        put_html("<h2>🚀 开始搜索...</h2>")
        
        # 显示搜索信息
        put_table([
            ["搜索关键字", keyword],
            ["获取数量", str(count)]
        ])
        
        try:
            # 显示进度
            put_processbar('search_progress')
            set_processbar('search_progress', 0.3)
            put_text("正在初始化...")
            
            # 动态导入以避免循环导入
            from crawlers.douyin.web.web_crawler import DouyinWebCrawler
            crawler = DouyinWebCrawler()
            
            set_processbar('search_progress', 0.5)
            put_text("正在搜索视频...")
            
            # 执行搜索
            search_data = asyncio.run(crawler.fetch_videos_complete_data(keyword, count))
            set_processbar('search_progress', 0.9)
            
            if not search_data or len(search_data.get('videos', [])) == 0:
                self.show_error("未找到相关视频，请尝试其他关键字")
                return
            
            # 显示搜索结果
            put_text("正在处理数据...")
            self.display_results(search_data)
            
            set_processbar('search_progress', 1.0)
            put_success("搜索完成！")
            
        except Exception as e:
            self.show_error(f"搜索失败: {str(e)}")
            import traceback
            put_text(f"详细错误信息: {traceback.format_exc()}")
    
    def display_results(self, search_data: dict):
        """显示搜索结果"""
        put_html("<hr>")
        put_html("<h2>📊 搜索结果</h2>")
        
        search_info = search_data.get('search_info', {})
        videos = search_data.get('videos', [])
        
        # 搜索摘要
        put_table([
            ["搜索关键字", search_info.get('keyword', '')],
            ["找到视频数", str(len(videos))],
            ["搜索时间", search_info.get('search_time', '')]
        ])
        
        # 视频列表
        for i, video in enumerate(videos, 1):
            put_html(f"<h3>视频 {i}: {video.get('desc', '无描述')[:50]}...</h3>")
            
            author = video.get('author', {})
            stats = video.get('statistics', {})
            
            # 基本信息
            put_table([
                ["视频ID", video.get('aweme_id', '')],
                ["作者昵称", author.get('nickname', '')],
                ["点赞数", f"{stats.get('digg_count', 0):,}"],
                ["评论数", f"{stats.get('comment_count', 0):,}"],
                ["分享数", f"{stats.get('share_count', 0):,}"]
            ])
            
            put_html("<hr>")
        
        # 操作按钮
        put_buttons([
            {'label': '重新搜索', 'value': 'search_again'}
        ], onclick=self.handle_button_click)
    
    def show_error(self, message: str):
        """显示错误信息"""
        put_html("<hr>")
        put_error(message)
        put_buttons([
            {'label': '重新搜索', 'value': 'search_again'}
        ], onclick=self.handle_button_click)
    
    def handle_button_click(self, choice):
        """处理按钮点击"""
        if choice == 'search_again':
            self.search_interface()


def video_search_simple_interface():
    """简化视频搜索页面入口函数"""
    search = VideoSearchSimple()
    search.search_interface()